/*
 * SonarQube Java
 * Copyright (C) 2012-2025 SonarSource Sàrl
 * mailto:info AT sonarsource DOT com
 *
 * This program is free software; you can redistribute it and/or
 * modify it under the terms of the Sonar Source-Available License Version 1, as published by SonarSource SA.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
 * See the Sonar Source-Available License for more details.
 *
 * You should have received a copy of the Sonar Source-Available License
 * along with this program; if not, see https://sonarsource.com/license/ssal/
 */
package org.sonar.plugins.java.api.tree;

import org.sonar.java.annotations.Beta;

import javax.annotation.Nullable;
import java.util.List;

/**
 * 'try' statement.
 *
 * JLS 14.20
 *
 * <pre>
 *   try {@link #block()} {@link #catches()} finally {@link #finallyBlock()}
 *   try ({@link #resourceList()}) {@link #block()} {@link #catches()} finally {@link #finallyBlock()}
 * </pre>
 *
 * @since Java 1.3
 */
@Beta
public interface TryStatementTree extends StatementTree {

  SyntaxToken tryKeyword();

  @Nullable
  SyntaxToken openParenToken();

  /**
   * Until Java 9, resource could only be instance of {@link VariableTree}. Since Java 9 it is possible to refer to resources by existing effectively final variables,
   * so list can also contain {@link IdentifierTree} or {@link MemberSelectExpressionTree}.
   *
   * @since Java 9
   */
  ListTree<Tree> resourceList();

  @Nullable
  SyntaxToken closeParenToken();

  BlockTree block();

  List<CatchTree> catches();

  @Nullable
  SyntaxToken finallyKeyword();

  @Nullable
  BlockTree finallyBlock();

}
